home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Sound / MPEGA_3.0 / CAMP / camp.e < prev    next >
Encoding:
Text File  |  1997-07-17  |  38.8 KB  |  1,099 lines

  1. /* Camp 1.0 - GUI for mpega 2.9 */
  2. /* Author:   Eric Sauvageau
  3.    Compiler: EC 3.2e
  4.    Needs:    ClassAct 2.0, asl.library, mpega 2.9+
  5.    Release:  Freeware
  6. */
  7.  
  8. /* FEATURES:
  9.  
  10.       - Fully font-sensitive GUI (no hardcoded crap)
  11.       - Can display the header information of the current mpega
  12.       - Multithreaded - You can start playing an mp3, and quit CAMP
  13.         while it's still playing
  14.       - Doesn't rely on external programs to stop playing neither on
  15.         CPU-hogger kludges.
  16.  
  17.   TODO:
  18.  
  19.       - Play a complete list.  For this, we'll have to point our
  20.         CreateNewProc() to a procedure instead of to the mpega seglist.
  21.         That procedure (spawned as a separate process) would handle 
  22.         playing a supplied list, launching mpega as many times as needed.
  23.  
  24.         One problem tho: how to be able to signal mpega so it stops
  25.         playing when the user clicks on "Stop"?  The solution seems to
  26.         lies in a non-implemented tag for CreateNewProc(): 
  27.         NP_NotifyOnDeath :(  Signaling the process that launched
  28.         
  29.  
  30.       - Pipe'ing mpega's text output so we could display it in our
  31.         own (nicely formatted) window.
  32.  
  33.  
  34.       - Finish the "Default" button in the prefs.
  35. */
  36.  
  37. OPT PREPROCESS
  38.  
  39. MODULE 'tools/boopsi','tools/inithook','other/geta4'
  40.  
  41. MODULE 'exec/nodes','intuition','graphics','intuition/intuition',
  42.        'intuition/gadgetclass','intuition/imageclass','exec/lists',
  43.        'intuition/intuitionbase','intuition/classusr',
  44.        'intuition/gadgetclass','intuition/cghooks','intuition/icclass',
  45.        'intuition/classes','tools/constructors','intuition/screens'
  46.  
  47. MODULE 'libraries/gadtools','intuition/icclass','dos','dos/dos','icon',
  48.        'graphics','intuition','intuition/intuition','utility/tagitem',
  49.        'exec/semaphores','exec/libraries','exec/ports','graphics/view',
  50.        'bevel','images/bevel','tools/classact_lib',
  51.        'utility/hooks','workbench/workbench','workbench/startup'
  52.  
  53. MODULE 'other/classact','window','classes/window','layout','gadgets/layout','gadgets/integer',
  54.        'gadgets/checkbox','images/bevel','integer','images/label','label',
  55.        'classes/window','other/classact_macros','checkbox',
  56.        'button','gadgets/button','gadgets/chooser',
  57.        'chooser','string','gadgets/string','dos/dostags','asl','libraries/asl'
  58.  
  59. MODULE 'exec/memory'
  60.  
  61.  
  62. /* General exceptions */
  63. RAISE "FAIL" IF CreateMsgPort() = NIL
  64.  
  65.  
  66. /* Gadget IDs */
  67. ENUM GAD_PLAY=1, GAD_FILENAME, GAD_POP, GAD_FREQDIV, GAD_QUALITY, 
  68.      GAD_PRI, GAD_BUFFER, GAD_VOLUME, GAD_FILEBUFFER, GAD_NOCOUNTER, 
  69.      GAD_NOAUDIO, GAD_MONO, GAD_WAITBUF, GAD_TIMECOUNT, GAD_FILTER, 
  70.      GAD_AUDIOMIX, GAD_AUDIOMIXFREQ, GAD_LIMITDECODE, GAD_LIMITDECODEFREQ, 
  71.      GAD_SEEK, GAD_SEEKTIME, GAD_QUIET, GAD_PREFS,GAD_AHI, GAD_AHIMODE,
  72.      GAD_SAVE,GAD_USE,GAD_CANCEL
  73.  
  74.  
  75.  
  76. /* Used for getFile() */
  77. ENUM GET_FILE=1,   -> Get a sound filename
  78.      GET_MPEGA     -> Get the mpega path/filename for the prefs.
  79.  
  80.  
  81. /* Prefs options struct - used for load/save */
  82.  
  83. CONST PREFSVER=01
  84.  
  85. OBJECT campPrefs
  86.    freqdiv:INT
  87.    quality:INT
  88.    taskpri:INT
  89.    volume:INT
  90.    buffer:LONG
  91.    filebuf:LONG
  92.    quiet:INT
  93.    silent:INT
  94.    mono:INT
  95.    waitbuf:INT
  96.    nocounter:INT
  97.    timecount:INT
  98.    filter:INT
  99.    audiomix:INT
  100.    audiomixfreq:LONG
  101.    limitdecode:INT
  102.    limitfreq:LONG
  103.    ahi:INT
  104.    ahimode:LONG
  105.    seek:INT
  106.    seektime:LONG
  107. ENDOBJECT
  108.  
  109. /* Global defs */
  110.  
  111. DEF filenameobj:PTR TO object,
  112.     playobj:PTR TO object,
  113.     mpegapath[256]:STRING,
  114.     window:PTR TO window,
  115.     title[120]:STRING,
  116.     tmparg[120]:STRING,
  117.     scr:PTR TO screen,
  118.     condef[128]:STRING
  119.  
  120.  
  121.  
  122. PROC main() HANDLE
  123. DEF win_object:PTR TO object,
  124.     appport=NIL:PTR TO mp,
  125.     signal,asig,
  126.     done=FALSE,
  127.     result,
  128.     code,
  129.     tmpres1,
  130.     apphook:hook,
  131.     filename[256]:STRING,
  132.     args1[80]:STRING,
  133.     args2[10]:STRING,
  134.     proc,
  135.     handle,
  136.     preferences:campPrefs,
  137.     
  138.     qualitylist=NIL:PTR TO lh,
  139.     freqlist=NIL:PTR TO lh,
  140.     ahiobj,
  141.     ahimodeobj,
  142.     freqdivobj,
  143.     qualityobj,
  144.     priobj,
  145.     bufferobj,
  146.     volumeobj,
  147.     filebufferobj,
  148.     audiomixobj,
  149.     audiomixfreqobj,
  150.     limitdecodeobj,
  151.     limitdecodefreqobj,
  152.     seekobj,
  153.     seektimeobj,
  154.     nocounterobj,
  155.     monoobj,
  156.     silentobj,
  157.     filterobj,
  158.     waitbufobj,
  159.     timecountobj,
  160.     quietobj
  161.  
  162.     
  163.  
  164.    windowbase  := myOpenClass('window.class',41)
  165.    layoutbase  := myOpenClass('gadgets/layout.gadget',41)
  166.    checkboxbase := myOpenClass('gadgets/checkbox.gadget',0)
  167.    integerbase := myOpenClass('gadgets/integer.gadget',0)
  168.    labelbase   := myOpenClass('images/label.image',0)
  169.    buttonbase  := myOpenClass('gadgets/button.gadget',0)
  170.    chooserbase := myOpenClass('gadgets/chooser.gadget',0)
  171.    bevelbase   := myOpenClass('images/bevel.image',0)
  172.    stringbase  := myOpenClass('gadgets/string.gadget',0)
  173.    iconbase    := myOpenClass('icon.library',0,TRUE)
  174.  
  175.    freqlist := chooserLabelsA(['Normal','Freq/2','Freq/4',NIL])
  176.    qualitylist := chooserLabelsA(['Worst','Average','Best',NIL])
  177.  
  178.    appport := CreateMsgPort()
  179.  
  180.    scr:=LockPubScreen(NIL)
  181.  
  182.    inithook(apphook,{appMsgFunc},filenameobj)
  183.  
  184.    IF (handle := Open({prefsname},MODE_OLDFILE))
  185.       IF (code := FgetC(handle)=PREFSVER)        -> Version
  186.          Fgets(handle,mpegapath,255)
  187.          SetStr(mpegapath,StrLen(mpegapath)-1)     -> Chop last char (CR)
  188.          Fgets(handle,condef,255)
  189.          SetStr(condef,StrLen(condef)-1)           -> Chop last char (CR)
  190.          Fread(handle,preferences,SIZEOF campPrefs,1)
  191.       ELSE
  192.          defaultPrefs(preferences)
  193.       ENDIF
  194.       Close(handle)
  195.    ELSE
  196.  
  197. /* Default prefs */
  198.       defaultPrefs(preferences)
  199.  
  200.    ENDIF
  201.  
  202.  
  203.    win_object := WindowObject,
  204.                      WA_TITLE, 'CAMP 1.0',
  205.                      WA_DEPTHGADGET, TRUE,
  206.                      WA_SIZEBBOTTOM, TRUE,
  207.                      WA_SIZEGADGET,TRUE,
  208.                      WA_DRAGBAR, TRUE,
  209.                      WA_RMBTRAP, TRUE,
  210.                      WA_ACTIVATE,TRUE,
  211.                      WA_CLOSEGADGET,TRUE,
  212.                      WINDOW_APPPORT, appport,
  213.                      WINDOW_APPWINDOW, TRUE,
  214.                      WINDOW_APPMSGHOOK, apphook,
  215.  
  216.                      WINDOW_ICONIFYGADGET, TRUE,
  217.                      WINDOW_ICON, GetDiskObjectNew('PROGDIR:camp'),
  218.                      WINDOW_ICONTITLE, 'CAMP',
  219.                      WINDOW_POSITION, WPOS_CENTERSCREEN,
  220.                      WINDOW_LOCKHEIGHT, TRUE,
  221.  
  222.                      WINDOW_PARENTGROUP, VGroupObject,
  223.                         LAYOUT_DEFERLAYOUT, TRUE,
  224.                         LAYOUT_SPACEOUTER, TRUE,
  225.  
  226.                         StartHGroup,
  227.  
  228.                            StartVGroup, EvenSized,
  229.                               LAYOUT_BEVELSTYLE, BVS_GROUP,
  230.                               LAYOUT_SPACEOUTER, TRUE,
  231.                               LAYOUT_LABEL,'Functions',
  232.  
  233.                               StartMember, playobj := ButtonObject,
  234.                                  GA_TEXT,'_Play/Stop',
  235.                                  GA_ID, GAD_PLAY,
  236.                                  GA_DISABLED, TRUE,
  237.                               
  238.                                  GA_RELVERIFY,TRUE,
  239.                               EndMember,
  240.                               CHILD_SCALEWIDTH, 10,
  241.  
  242.                               StartMember, ButtonObject,
  243.                                  GA_TEXT,'Pref_s',
  244.                                  GA_ID, GAD_PREFS,
  245.                                  GA_RELVERIFY,TRUE,
  246.                               EndMember,
  247.  
  248.                            EndVGroup,
  249.                            CHILD_WEIGHTEDHEIGHT, 0,
  250.                            CHILD_WEIGHTEDWIDTH,0,
  251.  
  252.                            StartVGroup,
  253.  
  254.                               StartHGroup,
  255.                                  StartMember, filenameobj := StringObject,
  256.                                     GA_RELVERIFY, TRUE,
  257.                                     GA_ID, GAD_FILENAME,
  258.                                     STRINGA_MAXCHARS, 256,
  259.                                     STRINGA_MINVISIBLE, 10,
  260.                                  EndMember,
  261.                                  MemberLabel('File_name'),
  262.  
  263.                                  StartMember, ButtonObject,
  264.                                     BUTTON_AUTOBUTTON, BAG_POPFILE,
  265.                                     GA_RELVERIFY, TRUE,
  266.                                     GA_ID, GAD_POP,
  267.                                  EndMember,
  268.                                  CHILD_WEIGHTEDWIDTH, 0,
  269.                                  CHILD_WEIGHTEDHEIGHT,0,
  270.  
  271.                               EndGroup,
  272.                               CHILD_WEIGHTEDHEIGHT,0,
  273.  
  274.                               StartHGroup,
  275.  
  276.                                  StartVGroup,
  277.                                     StartMember, freqdivobj := ChooserObject,
  278.                                       CHOOSER_LABELS, freqlist,
  279.                                       CHOOSER_SELECTED, preferences.freqdiv,
  280.                                       GA_ID, GAD_FREQDIV,
  281.                                     EndMember,
  282.                                     MemberLabel('_Frequency'),
  283.  
  284.                                     StartMember, filebufferobj := IntegerObject,
  285.                                        GA_ID, GAD_FILEBUFFER,
  286.                                        INTEGER_NUMBER, preferences.filebuf,
  287.                                        INTEGER_MAXCHARS, 4,
  288.                                        INTEGER_MINIMUM, 1,
  289.                                        INTEGER_MAXIMUM, 1024,
  290.                                     EndMember,
  291.                                     MemberLabel('I/O _Buffer (Kb)'),
  292.                               
  293.                                     StartMember, bufferobj := IntegerObject,
  294.                                        GA_ID, GAD_BUFFER,
  295.                                        INTEGER_NUMBER, preferences.buffer,
  296.                                        INTEGER_MAXCHARS, 7,
  297.                                        INTEGER_MINIMUM, 1,
  298.                                     EndMember,
  299.                                     MemberLabel('Buffer _Time (ms)'),
  300.  
  301.                                  EndGroup,
  302.  
  303.                                  StartVGroup,
  304.  
  305.                                     StartMember, qualityobj := ChooserObject,
  306.                                        CHOOSER_LABELS, qualitylist,
  307.                                        GA_ID, GAD_QUALITY,
  308.                                        CHOOSER_SELECTED, preferences.quality,
  309.                                     EndMember,
  310.                                     MemberLabel('_Quality'),
  311.  
  312.                                     StartMember, volumeobj := IntegerObject,
  313.                                        GA_ID, GAD_VOLUME,
  314.                                        INTEGER_NUMBER, preferences.volume,
  315.                                        INTEGER_MAXCHARS, 4,
  316.                                        INTEGER_MINIMUM, 0,
  317.                                        INTEGER_MAXIMUM, 400,
  318.                                     EndMember,
  319.                                     MemberLabel('_Volume (%)'),
  320.  
  321.                                     StartMember, priobj := IntegerObject,
  322.                                        GA_ID, GAD_PRI,
  323.                                        INTEGER_NUMBER, preferences.taskpri,
  324.                                        INTEGER_MAXCHARS, 3,
  325.                                        INTEGER_MINIMUM, -30,
  326.                                        INTEGER_MAXIMUM, 30,
  327.                                     EndMember,
  328.                                     MemberLabel('Tas_k Priority'),
  329.  
  330.                                  EndGroup,
  331.                               EndGroup,
  332.  
  333.  
  334.                            EndGroup,
  335.  
  336.                         EndGroup,
  337.  
  338.                         StartHGroup,
  339.                            StartVGroup,
  340.                               StartMember, waitbufobj := CheckBoxObject,
  341.                                  GA_ID, GAD_WAITBUF,
  342.                                  GA_TEXT, '_Wait for buffer',
  343.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  344.                                  GA_SELECTED, preferences.waitbuf,
  345.                               EndMember,
  346.  
  347.                               StartMember, filterobj := CheckBoxObject,
  348.                                  GA_ID, GAD_FILTER,
  349.                                  GA_TEXT, 'Audio Fi_lter',
  350.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  351.                                  GA_SELECTED, preferences.filter,
  352.                               EndMember,
  353.  
  354.                               StartMember, monoobj:= CheckBoxObject,
  355.                                  GA_ID, GAD_MONO,
  356.                                  GA_TEXT, '_Mono output',
  357.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  358.                                  GA_SELECTED, preferences.mono,
  359.                               EndMember,
  360.  
  361.                               StartMember, silentobj := CheckBoxObject,
  362.                                  GA_ID, GAD_NOAUDIO,
  363.                                  GA_TEXT, 'No _Audio',
  364.                                  GA_SELECTED, preferences.silent,
  365.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  366.                               EndMember,
  367.  
  368.                            EndGroup,
  369.                            CHILD_WEIGHTEDWIDTH,0,
  370.  
  371.                            StartVGroup,
  372.                               StartMember, quietobj:= CheckBoxObject,
  373.                                  GA_ID, GAD_QUIET,
  374.                                  GA_RELVERIFY, TRUE,
  375.                                  GA_TEXT, 'No _Output',
  376.                                  GA_SELECTED, preferences.quiet,
  377.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  378.                               EndMember,
  379.  
  380.                               StartMember, nocounterobj := CheckBoxObject,
  381.                                  GA_ID, GAD_NOCOUNTER,
  382.                                  GA_TEXT, 'No _Counter',
  383.                                  GA_SELECTED, preferences.nocounter,
  384.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  385.                                  GA_DISABLED, (IF preferences.quiet THEN TRUE ELSE FALSE),
  386.                               EndMember,
  387.  
  388.  
  389.                               StartMember, timecountobj := CheckBoxObject,
  390.                                  GA_ID, GAD_TIMECOUNT,
  391.                                  GA_TEXT, '_Display Time',
  392.                                  GA_SELECTED, preferences.timecount,
  393.                                  GA_DISABLED, (IF preferences.quiet THEN TRUE ELSE FALSE),
  394.                                  CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  395.                               EndMember,
  396.  
  397.                            EndGroup,
  398.                            CHILD_WEIGHTEDWIDTH,0,
  399.  
  400.                            StartHGroup,
  401.  
  402.                               LAYOUT_BEVELSTYLE, BVS_GROUP,
  403.                               LAYOUT_SPACEOUTER, TRUE,
  404.  
  405.                               StartVGroup,
  406.  
  407.                                  StartMember, audiomixobj := CheckBoxObject,
  408.                                     GA_ID, GAD_AUDIOMIX,
  409.                                     GA_RELVERIFY, TRUE,
  410.                                     GA_SELECTED, preferences.audiomix,
  411.                                     GA_TEXT, 'Audio Mi_xing',
  412.                                     CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  413.                                  EndMember,
  414.  
  415.                                  StartMember, limitdecodeobj := CheckBoxObject,
  416.                                     GA_ID, GAD_LIMITDECODE,
  417.                                     GA_RELVERIFY, TRUE,
  418.                                     GA_TEXT, 'L_imit Decode Freq.',
  419.                                     GA_SELECTED, preferences.limitdecode,
  420.                                     CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  421.                                  EndMember,
  422.  
  423.                                  StartMember, seekobj := CheckBoxObject,
  424.                                     GA_TEXT, 'S_eek Position (ms)',
  425.                                     GA_RELVERIFY, TRUE,
  426.                                     GA_ID, GAD_SEEK,
  427.                                     GA_SELECTED, preferences.seek,
  428.                                     CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  429.                                  EndMember,
  430.  
  431.                                  StartMember, ahiobj := CheckBoxObject,
  432.                                     GA_TEXT, 'A_HI AudioMode (hex)',
  433.                                     GA_RELVERIFY, TRUE,
  434.                                     GA_ID, GAD_AHI,
  435.                                     GA_SELECTED, preferences.ahi,
  436.                                     CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
  437.                                  EndMember,
  438.                               EndGroup,
  439.  
  440.                               StartVGroup,
  441.                                  StartMember, audiomixfreqobj:= IntegerObject,
  442.                                     GA_DISABLED, (IF preferences.audiomix THEN FALSE ELSE TRUE),
  443.                                     GA_ID, GAD_AUDIOMIXFREQ,
  444.                                     INTEGER_NUMBER, preferences.audiomixfreq,
  445.                                     INTEGER_MAXCHARS, 6,
  446.                                     INTEGER_MINIMUM, 1000,
  447.                                     INTEGER_MAXIMUM, 60000,
  448.                                  EndMember,
  449.  
  450.                                  StartMember, limitdecodefreqobj:= IntegerObject,
  451.                                     GA_DISABLED, (IF preferences.limitdecode THEN FALSE ELSE TRUE),
  452.                                     GA_ID, GAD_LIMITDECODEFREQ,
  453.                                     INTEGER_NUMBER, preferences.limitfreq,
  454.                                     INTEGER_MAXCHARS, 6,
  455.                                     INTEGER_MINIMUM, 1000,
  456.                                     INTEGER_MAXIMUM, 80000,
  457.                                  EndMember,
  458.  
  459.                                  StartMember, seektimeobj:= IntegerObject,
  460.                                     GA_DISABLED, (IF preferences.seek THEN FALSE ELSE TRUE),
  461.  
  462.                                     GA_ID, GAD_SEEKTIME,
  463.                                     INTEGER_NUMBER, preferences.seektime,
  464.                                     INTEGER_MAXCHARS, 10,
  465.                                     INTEGER_MINIMUM, 0,
  466.                                   EndMember,
  467.  
  468.                                   StartMember, ahimodeobj:= StringObject,
  469.                                      GA_ID, GAD_AHIMODE,
  470.                                      STRINGA_TEXTVAL,StringF(filename,'\h',preferences.ahimode),
  471.                                      STRINGA_MAXCHARS, 10,
  472.                                      GA_DISABLED, (IF preferences.ahi THEN FALSE ELSE TRUE),
  473.  
  474.                                      STRINGA_MINVISIBLE, 8,
  475. ->                                      STRINGA_HOOKTYPE, SHK_HEXIDECIMAL,
  476.                                   EndMember,
  477.                                EndGroup,
  478.                             EndGroup,
  479.                          EndGroup,
  480.                       EndGroup,
  481.  
  482.                    EndWindow
  483.  
  484.  
  485. -> Object creation sucessful?
  486.    IF win_object
  487.  
  488.  
  489. -> Open the window.
  490.  
  491.       IF (window := CA_OpenWindow(win_object))
  492.  
  493. -> Obtain the window wait signal mask.
  494.  
  495.          GetAttr(WINDOW_SIGMASK, win_object, {signal})
  496.  
  497. -> Input Event Loop
  498.  
  499.          asig := Shl(1,appport.sigbit)
  500.  
  501.          WHILE (done = FALSE)
  502.             Wait(signal OR asig)
  503.  
  504.             WHILE ((result := CA_HandleInput(win_object,{code})) <> WMHI_LASTMSG)
  505.  
  506.                tmpres1 := (result AND WMHI_CLASSMASK)
  507.  
  508.                SELECT tmpres1
  509.  
  510.                   CASE WMHI_CLOSEWINDOW ; done := TRUE
  511.  
  512.                   CASE WMHI_GADGETUP
  513.                      tmpres1 := (result AND WMHI_GADGETMASK)
  514.  
  515.                      SELECT tmpres1
  516.                        CASE GAD_QUIET
  517.                             
  518.                          disableGadget(nocounterobj, getState(quietobj))
  519.                          disableGadget(timecountobj, getState(quietobj))
  520.  
  521.                        CASE GAD_PLAY
  522.                           Forbid()
  523.                           IF (proc := FindTask({childname}))
  524.                              Signal(proc,SIGBREAKF_CTRL_C)
  525.                              Permit()
  526.                           ELSE
  527.                              Permit()
  528.                              GetAttr(CHOOSER_SELECTED, freqdivobj, {code})
  529.                              SELECT code
  530.                                 CASE 0 ; code := 1
  531.                                 CASE 1 ; code := 2
  532.                                 CASE 2 ; code := 4
  533.                              ENDSELECT
  534.                              StringF(args1,'-d \d ',code)
  535.  
  536.                              GetAttr(CHOOSER_SELECTED, qualityobj, {code})
  537.                              StrAdd(args1,StringF(args2,'-q \d ',code))
  538.  
  539.                              GetAttr(INTEGER_NUMBER, priobj, {code})
  540.                              StrAdd(args1,StringF(args2,'-p \d ',code))
  541.                                 
  542.                              GetAttr(INTEGER_NUMBER, bufferobj, {code})
  543.                              StrAdd(args1,StringF(args2,'-t \d ',code))
  544.                                 
  545.                              GetAttr(INTEGER_NUMBER, volumeobj, {code})
  546.                              code := (256*code)/400
  547.                              StrAdd(args1,StringF(args2,'-v \d ',code))
  548.                                 
  549.                              GetAttr(INTEGER_NUMBER, filebufferobj, {code})
  550.                              StrAdd(args1,StringF(args2,'-b \d ',code))
  551.                                 
  552.                              IF getState(silentobj) THEN StrAdd(args1,'-s ')
  553.                             
  554.                              IF getState(monoobj) THEN StrAdd(args1,'-m ')
  555.                                 
  556.                              IF getState(waitbufobj) THEN StrAdd(args1,'-w ')
  557.                                 
  558.                              IF getState(timecountobj) THEN StrAdd(args1,'-T ')
  559.  
  560.                              IF getState(filterobj) THEN StrAdd(args1,'-f 1 ') ELSE StrAdd(args1,'-f 0 ')
  561.                                 
  562.                              IF getState(audiomixobj)
  563.                                 GetAttr(INTEGER_NUMBER, audiomixfreqobj, {code})
  564.                                 StrAdd(args1,StringF(args2,'-x \d ',code))
  565.                              ENDIF
  566.                                 
  567.                              IF getState(limitdecodeobj)
  568.                                 GetAttr(INTEGER_NUMBER, limitdecodefreqobj, {code})
  569.                                 StrAdd(args1,StringF(args2,'-F \d ',code))
  570.                              ENDIF
  571.  
  572.                              IF getState(ahiobj)
  573.                                 GetAttr(STRINGA_TEXTVAL, ahimodeobj, {filename})
  574.                                 StrAdd(args1,StringF(args2,'-I\s ',filename))
  575.                              ENDIF
  576.                                 
  577.                              IF getState(seekobj)
  578.                                 GetAttr(INTEGER_NUMBER, seektimeobj, {code})
  579.                                 StrAdd(args1,StringF(args2,'-S \d ',code))
  580.                              ENDIF
  581.                                 
  582. /* If no output, then also disable header -> will also improve speed */
  583.                              IF ((code := getState(quietobj)) OR getState(nocounterobj)) THEN StrAdd(args1,'-n ')
  584.  
  585.  
  586.                              GetAttr(STRINGA_TEXTVAL, filenameobj, {filename})
  587.                              
  588.                              play(filename,args1, code)
  589.                           ENDIF
  590.  
  591.                        CASE GAD_FILENAME
  592.                           GetAttr(STRINGA_TEXTVAL, filenameobj, {filename})
  593.  
  594.                           setSource(filename)
  595.  
  596.                        CASE GAD_POP
  597.                           GetAttr(STRINGA_TEXTVAL, filenameobj, {filename})
  598.                           getFile(GET_FILE, filename)
  599.  
  600.                        CASE GAD_PREFS
  601.  
  602.                           preferences.freqdiv := GetAttr(CHOOSER_SELECTED, freqdivobj, {code}) BUT code
  603.                           preferences.quality := GetAttr(CHOOSER_SELECTED, qualityobj, {code}) BUT code
  604.                           preferences.taskpri := GetAttr(INTEGER_NUMBER, priobj, {code}) BUT code
  605.                           preferences.volume := GetAttr(INTEGER_NUMBER, volumeobj, {code}) BUT code
  606.                           preferences.buffer := GetAttr(INTEGER_NUMBER, bufferobj, {code}) BUT code
  607.                           preferences.filebuf := GetAttr(INTEGER_NUMBER, filebufferobj, {code}) BUT code
  608.                           preferences.mono := getState(monoobj)
  609.                           preferences.waitbuf := getState(waitbufobj)
  610.                           preferences.quiet := getState(quietobj)
  611.                           preferences.silent := getState(silentobj)
  612.                           preferences.nocounter := getState(nocounterobj)
  613.                           preferences.timecount := getState(timecountobj)
  614.                           preferences.filter := getState(filterobj)
  615.                           preferences.audiomix := getState(audiomixobj)
  616.                           preferences.audiomixfreq := GetAttr(INTEGER_NUMBER, audiomixfreqobj, {code}) BUT code
  617.                           preferences.limitdecode :=getState(limitdecodeobj)
  618.                           preferences.limitfreq := GetAttr(INTEGER_NUMBER, limitdecodefreqobj, {code}) BUT code
  619.                           preferences.ahi := getState(ahiobj)
  620.                           preferences.ahimode := GetAttr(STRINGA_TEXTVAL, filenameobj, {filename}) BUT Val(filename)
  621.                           preferences.seek := getState(seekobj)
  622.                           preferences.seektime := GetAttr(INTEGER_NUMBER, seektimeobj, {code}) BUT code
  623.  
  624.                           prefs(preferences)
  625.  
  626.                        CASE GAD_AUDIOMIX
  627.                             disableGadget(audiomixfreqobj,Not(getState(audiomixobj)))
  628.                        CASE GAD_LIMITDECODE
  629.                             disableGadget(limitdecodefreqobj,Not(getState(limitdecodeobj)))
  630.                        CASE GAD_SEEK
  631.                             disableGadget(seektimeobj,Not(getState(seekobj)))
  632.                        CASE GAD_AHI
  633.                             disableGadget(ahimodeobj,Not(getState(ahiobj)))
  634.                      ENDSELECT
  635.  
  636.                   CASE WMHI_ICONIFY
  637.                      IF (CA_Iconify(win_object)) THEN window := NIL
  638.  
  639.                   CASE WMHI_UNICONIFY
  640.                      window := CA_OpenWindow(win_object)
  641.  
  642.                ENDSELECT
  643.             ENDWHILE
  644.          ENDWHILE
  645.       ENDIF
  646.  
  647.      DisposeObject(win_object)
  648.    ENDIF
  649.  
  650. EXCEPT DO
  651.  
  652. -> We already notified the user if the exception was "LIB".
  653.  
  654.    IF (exception >0) AND (exception <> "LIB") THEN request_d('Failed to start CAMP.')
  655.  
  656.    IF appport THEN DeleteMsgPort(appport)
  657.  
  658. -> Close the gadgets/classes.
  659.  
  660.    IF freqlist THEN freeChooserLabels(freqlist)
  661.    IF qualitylist THEN freeChooserLabels(qualitylist)
  662.  
  663.    CloseLibrary(aslbase)     -> CloseLibrary(NIL) is legal.
  664.    CloseLibrary(bevelbase)
  665.    CloseLibrary(labelbase)
  666.    CloseLibrary(checkboxbase)
  667.    CloseLibrary(integerbase)
  668.    CloseLibrary(chooserbase)
  669.    CloseLibrary(buttonbase)
  670.    CloseLibrary(layoutbase)
  671.    CloseLibrary(windowbase)
  672.    CloseLibrary(iconbase)
  673.  
  674.    IF scr THEN UnlockPubScreen(NIL,scr)
  675.  
  676. ENDPROC
  677.  
  678.  
  679.  
  680. PROC prefs(prefs:PTR TO campPrefs) HANDLE
  681. DEF prefs_object,
  682.     prefs_win,
  683.     pathobj,
  684.     condefobj,
  685.  
  686.     signal,
  687.     done=FALSE,
  688.     result,
  689.     code,
  690.     tmpres1,
  691.     filename[256]:STRING,
  692.     lock
  693.  
  694.  
  695.       prefs_object := WindowObject,
  696.                      WA_TITLE, 'CAMP - Preferences',
  697.                      WA_DEPTHGADGET, TRUE,
  698.                      WA_SIZEBBOTTOM, TRUE,
  699.                      WA_SIZEGADGET,TRUE,
  700.                      WA_DRAGBAR, TRUE,
  701.                      WA_RMBTRAP, TRUE,
  702.                      WA_ACTIVATE,TRUE,
  703.  
  704.                      WINDOW_POSITION, WPOS_CENTERSCREEN,
  705.                      WINDOW_LOCKHEIGHT, TRUE,
  706.  
  707.                      WINDOW_PARENTGROUP, VGroupObject,
  708.                         LAYOUT_DEFERLAYOUT, TRUE,
  709.                         LAYOUT_SPACEOUTER, TRUE,
  710.  
  711.                         StartHGroup,
  712.                         
  713.                            StartVGroup, EvenSized,
  714.  
  715.                               StartMember, pathobj := StringObject,
  716.                                  GA_RELVERIFY, TRUE,
  717.                                  GA_ID, GAD_FILENAME,
  718.                                  STRINGA_MAXCHARS, 256,
  719.                                  STRINGA_MINVISIBLE, 25,
  720.                                  STRINGA_TEXTVAL, mpegapath,
  721.                               EndMember,
  722.                               MemberLabel('MPEGA _Path'),
  723.  
  724.  
  725.                               StartMember, condefobj := StringObject,
  726.                                  GA_RELVERIFY, TRUE,
  727.                                  STRINGA_MAXCHARS, 256,
  728.                                  STRINGA_MINVISIBLE, 25,
  729.                                  STRINGA_TEXTVAL, condef,
  730.                               EndMember,
  731.                               MemberLabel('Text _Output'),
  732.                            EndGroup,
  733.  
  734.                            StartMember, ButtonObject,
  735.                               BUTTON_AUTOBUTTON, BAG_POPFILE,
  736.                               GA_RELVERIFY, TRUE,
  737.                               GA_ID, GAD_POP,
  738.                            EndMember,
  739.                            CHILD_WEIGHTEDWIDTH, 0,
  740.                            CHILD_WEIGHTEDHEIGHT,0,
  741.  
  742.                         EndGroup,
  743.  
  744.  
  745.                         StartHGroup, EvenSized,
  746. /*
  747.                            StartMember, ButtonObject,
  748.                               GA_RELVERIFY, TRUE,
  749.                               GA_ID, GAD_DEFAULT,
  750.                               GA_TEXT,'_Default',
  751.                            EndMember,
  752. */
  753.                            StartMember, ButtonObject,
  754.                               GA_RELVERIFY, TRUE,
  755.                               GA_ID, GAD_SAVE,
  756.                               GA_TEXT,'_Save',
  757.                            EndMember,
  758.  
  759.                            StartMember, ButtonObject,
  760.                               GA_RELVERIFY, TRUE,
  761.                               GA_ID, GAD_USE,
  762.                               GA_TEXT,'_Use',
  763.                            EndMember,
  764.  
  765.                            StartMember, ButtonObject,
  766.                               GA_RELVERIFY, TRUE,
  767.                               GA_ID, GAD_CANCEL,
  768.                               GA_TEXT,'_Cancel',
  769.                            EndMember,
  770.  
  771.                         EndGroup,
  772.  
  773.                       EndGroup,
  774.  
  775.                    EndWindow
  776.  
  777.  
  778. -> Object creation sucessful?
  779.       IF prefs_object
  780.  
  781. -> Open the window.
  782.  
  783.          IF (prefs_win := CA_OpenWindow(prefs_object))
  784.  
  785. -> Obtain the window wait signal mask.
  786.  
  787.             GetAttr(WINDOW_SIGMASK, prefs_object, {signal})
  788.  
  789. -> Input Event Loop
  790.  
  791.             WHILE (done = FALSE)
  792.                Wait(signal)
  793.  
  794.                WHILE ((result := CA_HandleInput(prefs_object,{code})) <> WMHI_LASTMSG)
  795.  
  796.                   tmpres1 := (result AND WMHI_CLASSMASK)
  797.  
  798.                   SELECT tmpres1
  799.  
  800.                      CASE WMHI_CLOSEWINDOW ; done := TRUE
  801.  
  802.                      CASE WMHI_GADGETUP
  803.                         tmpres1 := (result AND WMHI_GADGETMASK)
  804.  
  805.                         SELECT tmpres1
  806.                           CASE GAD_FILENAME
  807.                              GetAttr(STRINGA_TEXTVAL, pathobj, {filename})
  808.                              IF (lock := Lock(filename,SHARED_LOCK))
  809.                                 UnLock(lock)
  810.                              ELSE
  811.                                 SetWindowTitles(prefs_win,'File not found!',-1)
  812.                                 DisplayBeep(scr)
  813.                              ENDIF
  814.  
  815.                           CASE GAD_POP
  816.                              getFile(GET_MPEGA,mpegapath)
  817.                              IF SetGadgetAttrsA(pathobj, prefs_win, NIL, [STRINGA_TEXTVAL, mpegapath, TAG_END]) THEN  RefreshGList(pathobj,prefs_win, NIL, 1)
  818.  
  819.                           CASE GAD_SAVE
  820.                              GetAttr(STRINGA_TEXTVAL, pathobj, {filename})
  821.                              StrCopy(mpegapath,filename)
  822.  
  823.                              GetAttr(STRINGA_TEXTVAL, condefobj, {filename})
  824.                              StrCopy(condef,filename)
  825.  
  826.                              savePrefs({arcprefsname},prefs)
  827.                              savePrefs({prefsname},prefs)
  828.  
  829.                              done := TRUE
  830.  
  831.                           CASE GAD_USE
  832.                              GetAttr(STRINGA_TEXTVAL, pathobj, {filename})
  833.                              StrCopy(mpegapath,filename)
  834.  
  835.                              GetAttr(STRINGA_TEXTVAL, condefobj, {filename})
  836.                              StrCopy(condef,filename)
  837.                              done := TRUE
  838.  
  839.                           CASE GAD_CANCEL
  840.                              done := TRUE
  841. /*
  842.                           CASE GAD_DEFAULT
  843.                              done := TRUE
  844.                              defaultPrefs()
  845. ->TODO: Update all gadgets in the main window.
  846. */
  847.                         ENDSELECT
  848.  
  849.                   ENDSELECT
  850.  
  851.                ENDWHILE
  852.  
  853.             ENDWHILE
  854.          ENDIF
  855.  
  856.         DisposeObject(prefs_object)
  857.       ENDIF
  858. EXCEPT
  859. -> Trap exceptions
  860. ENDPROC
  861.  
  862.  
  863. /* Save prefs to disk */
  864. PROC savePrefs(filename:PTR TO CHAR,prefs:PTR TO campPrefs)
  865. DEF handle
  866.  
  867.    IF (handle := Open(filename,NEWFILE))
  868.       FputC(handle,PREFSVER)
  869.       Fputs(handle,mpegapath)
  870.       FputC(handle,"\n")
  871.       Fputs(handle,condef)
  872.       FputC(handle,"\n")
  873.       Fwrite(handle,prefs,SIZEOF campPrefs,1)
  874.       Close(handle)
  875.    ENDIF
  876.  
  877. ENDPROC
  878.  
  879.  
  880. /* Set default prefs */
  881. PROC defaultPrefs(preferences:PTR TO campPrefs)
  882.          StrCopy(mpegapath,'C:mpega')
  883.          StrCopy(condef,'CON:0/25//100/CAMP Output/AUTO')
  884.          preferences.freqdiv := 0
  885.          preferences.quality := 0
  886.          preferences.taskpri := 0
  887.          preferences.volume  := 100
  888.          preferences.buffer  := 100
  889.          preferences.filebuf := 16
  890.          preferences.mono    := FALSE
  891.          preferences.quiet   := FALSE
  892.          preferences.silent  := FALSE
  893.          preferences.waitbuf := FALSE
  894.          preferences.nocounter := FALSE
  895.          preferences.timecount := FALSE
  896.          preferences.filter    := FALSE
  897.          preferences.audiomix  := FALSE
  898.          preferences.audiomixfreq := 28000
  899.          preferences.limitdecode := FALSE
  900.          preferences.limitfreq   := 28000
  901.          preferences.ahi         := FALSE
  902.          preferences.ahimode     := 0
  903.          preferences.seek        := FALSE
  904.          preferences.seektime    := 0
  905. ENDPROC
  906.  
  907.  
  908. /*** AppMessage hook ***/
  909. /* hook is unusued, as well as winobj (our window PTR is global) */
  910.  
  911. PROC appMsgFunc(hook:PTR TO hook, winobj:PTR TO object, msg:PTR TO appmessage)
  912. DEF i, arg:PTR TO wbarg, name[256]:STRING
  913.  
  914.    i := msg.numargs
  915.    arg := msg.arglist
  916.  
  917.    WHILE i
  918.  
  919.       DEC i
  920.  
  921.       NameFromLock(arg.lock, name, 256)
  922.       AddPart(name,arg.name, 256)
  923.  
  924.       arg++
  925.  
  926.    ENDWHILE
  927.  
  928.    IF SetGadgetAttrsA(filenameobj, window, NIL, [STRINGA_TEXTVAL, name, TAG_END]) THEN RefreshGList(filenameobj, window, NIL, 1)
  929.  
  930.    setSource(name)
  931. ENDPROC
  932.  
  933.  
  934. PROC setSource(filename)
  935. DEF handle
  936. DEF command[256]:STRING
  937. DEF buffer[256]:STRING
  938. DEF tmpfile: PTR TO CHAR
  939.  
  940.    tmpfile := 'T:camp.temp'
  941.  
  942.    IF (handle := Open(tmpfile,MODE_NEWFILE))
  943.       StringF(command,'\s -h "\s"',mpegapath, filename)
  944.  
  945.       SystemTagList(command, [SYS_OUTPUT, handle,
  946.                                NP_STACKSIZE, 20000,
  947.                                TAG_END])
  948.  
  949.       Flush(handle)
  950. /* Rewind to the start */
  951.       Seek(handle,0,OFFSET_BEGINING)
  952.  
  953. /* Skip the header text */
  954.       Fgets(handle,buffer,255)
  955.       Fgets(handle,buffer,255)
  956.       Fgets(handle,buffer,255)
  957.       Fgets(handle,buffer,255)
  958.       Fgets(handle,buffer,255)
  959.       Fgets(handle,buffer,255)
  960.  
  961. /* Chops the last char (a CR) and copy into a global var so it can be
  962.    used in our wiwndow title - SetWindowTitles() does NOT copy it. */
  963.  
  964.       StrCopy(title,buffer,StrLen(buffer)-1)
  965.  
  966.       SetWindowTitles(window,title,-1)
  967.       Close(handle)
  968.       DeleteFile(tmpfile)
  969.    ENDIF
  970.  
  971. /* Will  enable only if it's a proper MP? file */
  972.    IF SetGadgetAttrsA(playobj, window, NIL, [GA_DISABLED, (IF (InStr(title,'Unable to',0) <> -1) THEN TRUE ELSE FALSE), TAG_END]) THEN  RefreshGList(playobj, window, NIL, 1)
  973.  
  974. ENDPROC
  975.  
  976.  
  977. /*** Play it Sam ***/
  978. PROC play(filename,arguments,quiet)
  979. DEF io, mpegaseg
  980.  
  981.  
  982.   StringF(tmparg ,'\s "\s"',arguments, filename)
  983.  
  984.   IF (mpegaseg := NewLoadSeg(mpegapath,NIL)) = NIL THEN RETURN
  985.  
  986.   IF quiet = FALSE
  987.      IF (io := Open(condef,MODE_NEWFILE)) = NIL THEN quiet := TRUE
  988.   ENDIF
  989.  
  990.   CreateNewProc([NP_SEGLIST, mpegaseg,
  991.                  NP_FREESEGLIST,TRUE,
  992.                  (IF quiet THEN TAG_IGNORE ELSE NP_OUTPUT), io,
  993.                  NP_NAME, {childname},
  994.                  NP_CLI, TRUE,
  995.                  NP_ARGUMENTS,tmparg,
  996.                  TAG_END])
  997.  
  998. ENDPROC
  999.  
  1000.  
  1001.  
  1002. /*** Disable/enable a gadget ***/
  1003. PROC disableGadget(gad, disable)
  1004.    IF SetGadgetAttrsA(gad, window, NIL,[GA_DISABLED, (IF disable THEN TRUE ELSE FALSE), TAG_DONE])  THEN RefreshGList(gad, window, NIL, 1)
  1005. ENDPROC
  1006.  
  1007.  
  1008.  
  1009. /*** Opens a file requester ***/
  1010.  
  1011. PROC getFile(type,current:PTR TO CHAR) HANDLE
  1012. DEF req:PTR TO filerequester
  1013. DEF filename[256]:STRING
  1014. DEF len
  1015.  
  1016. /* Why try to open it at statup since it might not even be needed? */
  1017.  
  1018.  IF aslbase = NIL THEN aslbase := myOpenClass('asl.library',37,TRUE)
  1019.  
  1020.  IF (len := StrLen(current))
  1021.     StrCopy(filename,current,len-StrLen(PathPart(current)))
  1022.  ENDIF
  1023.  
  1024.  IF req:=AllocAslRequest(ASL_FILEREQUEST,
  1025.        [ASLFR_TITLETEXT,(IF type = GET_MPEGA THEN 'Select the mpega executable' ELSE 'Select an MP2/MP3 file'),
  1026.         ASLFR_DOPATTERNS , (IF type = GET_MPEGA THEN FALSE ELSE TRUE),
  1027.         (IF type = GET_MPEGA THEN TAG_IGNORE ELSE ASLFR_INITIALPATTERN) , '#?.(mp2|mp3)',
  1028.         (IF len THEN ASLFR_INITIALFILE ELSE TAG_IGNORE), (IF len THEN FilePart(current) ELSE NIL),
  1029.         ASLFR_INITIALDRAWER,filename,
  1030.         ASLFR_SCREEN,scr,
  1031.         NIL])
  1032.  
  1033.     IF AslRequest(req,NIL)
  1034.        IF StrLen(req.file) >0
  1035.           StrCopy(filename,req.drawer,ALL)
  1036.           AddPart(filename,req.file,500)
  1037.           SetStr(filename,StrLen(filename))
  1038.  
  1039.           IF type = GET_FILE
  1040.              IF SetGadgetAttrsA(filenameobj, window, NIL, [STRINGA_TEXTVAL, filename, TAG_END]) THEN  RefreshGList(filenameobj, window, NIL, 1)
  1041.  
  1042.              setSource(filename)
  1043.           ELSE
  1044.              StrCopy(mpegapath,filename)
  1045.           ENDIF
  1046.        ENDIF
  1047.     ENDIF
  1048.     FreeAslRequest(req)
  1049.  ENDIF
  1050. EXCEPT
  1051. /* Just to intercept exceptions raised by myOpenClass() failures */
  1052.  
  1053. ENDPROC
  1054.  
  1055.  
  1056. /*** Returns if a gadget is selected (TRUE) or not (FALSE) ***/
  1057.  
  1058. PROC getState(gad)
  1059. DEF state
  1060.    GetAttr(GA_SELECTED, gad, {state})
  1061.  
  1062. /* Must do it this way, because we're getting '1' rather than '-1', which
  1063.    wouldn't allow us to use Not() later to invert it. */
  1064.  
  1065.    IF state THEN RETURN TRUE ELSE RETURN FALSE
  1066. ENDPROC
  1067.  
  1068.  
  1069. PROC myOpenClass(name,version, lib=FALSE)
  1070. DEF retval, buffer[256]:STRING
  1071.  
  1072.    IF ((retval := OpenLibrary(name, version)) = NIL) AND (lib=TRUE)
  1073.       StringF(buffer, 'SYS:Classes/\s', name)
  1074.       IF (retval := OpenLibrary(buffer, version)) = NIL
  1075.          StringF(buffer, 'Classes/\s', name)
  1076.          retval := OpenLibrary(buffer, version)
  1077.       ENDIF
  1078.    ENDIF
  1079.  
  1080.    IF retval = NIL
  1081.       StringF(buffer,'Can''t open "\s" V\d or better!',name,version)
  1082.       request_d(buffer)
  1083.       Raise("LIB")
  1084.    ENDIF
  1085. ENDPROC retval
  1086.  
  1087.  
  1088. PROC request_d(string) IS EasyRequestArgs(NIL,[20,0,'CAMP',string,'Damn!'],0,NIL)
  1089.  
  1090. CHAR '$VER: CAMP 1.0 (24.6.97) by Eric Sauvageau.' ,0
  1091.  
  1092. prefsname:
  1093. CHAR 'env:camp.prefs',0
  1094. arcprefsname:
  1095. CHAR 'envarc:camp.prefs',0
  1096.  
  1097. childname:
  1098. CHAR 'BootCamp',0
  1099.